// 手动实现new
function myNew(Fun, ...args) {
    let obj = {}
    obj.__proto__ = Fun.prototype
    let res = Fun.apply(obj, args)
    if(res instanceof Object) {
        return res
    } else {
        return obj
    }
}
function Person(name, age) {
    this.name = name
    this.age = age
}
let p = myNew(Person, 'zzz', 24)
console.log(p);
/**
 * new的过程（基于该过程，来实现手写new）
 * 1、创建一个实例对象
 * 2、将构造函数的显示原型prototype指向该实例对象的隐式原型__proto__
 * 3、this指向该实例对象
 * 4、将实例对象返回
 */
// 注意：构造函数实例化对象的时候，如果返回值为引用类型，则会返回该引用类型
// 如果是简单类型，则还是会原样返回该对象
// 所以在手写new的最后一行写了一个if判断
console.log(Object.prototype.toString.call(p));
console.log(myNew.prototype);
